Windows Forms - Funções auxiliares do Microsoft SQL Server

Se você já construiu uma querie longa e se perdeu nos campos e números de parâmetros esta função irá ajudar você.
Ela lista o nome do campo e o valor atribuido a ele numa querie sql.

Module SQL

Função para decompor uma querie select com muitos campos e valores

    Public Function DecompoeQuerie(Querie As String) As List(Of String)
        Dim a As Integer 'varre caractere por caractere da querie
        Dim b As String 'parte da query desmembrada
        Dim campos(1000) As String 'campos do insert
        Dim dados(1000) As String 'parametros recebidos
        Dim pnt1 As Integer = 0 'aponta para campos() e dados()
        Dim pnt2 As Integer = 0 'aponta para campos() e dados()
        Dim flg_apostrofo As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
        Dim flg_abreparenteses As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
        Dim c As String 'caractere da querie
        Dim retorno As New List(Of String) 'retorno

        'separando a parte inicial - até o abre parenteses - todos os campos num único string
        a = 1
        b = ""
        c = Mid(Querie, a, 1)
        While c <> "("
            b = b + c
            a = a + 1
            c = Mid(Querie, a, 1)
        End While
        b = b + Mid(Querie, a, 1)
        'frmQuerieDecomposta.ListBox1.Items.Add(b)        'insert into tabela(

        'separando os dados - todos os dados da querie num único string
        a = a + 1
        b = ""
        pnt1 = 0
        c = Mid(Querie, a, 1)
        While c <> ")"
            b = b + c
            If c = "," Then
                b = Strings.Left(b, Len(b) - 1)
                campos(pnt1) = b
                pnt1 = pnt1 + 1
                b = ""
            End If
            a = a + 1
            c = Mid(Querie, a, 1)
        End While

        'separando a parte intermediaria - ) values ( - insert into tabela(campos) values (
        b = ""
        c = Mid(Querie, a, 1)
        While c <> "("
            b = b + c
            a = a + 1
            c = Mid(Querie, a, 1)
        End While
        b = b + c
        a = a + 1
        'frmQuerieDecomposta.ListBox1.Items.Add(b)            ') values (

        flg_apostrofo = False 'flag dentro de apóstrofo-desconsiderar vírgulas
        flg_abreparenteses = False 'flag dentro de apóstrofo-desconsiderar vírgulas
        'separando os parametros
        b = ""
        pnt2 = 0
        c = Mid(Querie, a, 1)
        While c <> ")" Or (flg_apostrofo = True) Or (flg_abreparenteses = True)
            b = b + c

            'verificando as vírgulas - só contabilizar virgulas se estiver fora de 'Endereço x,x,x,' e convert(x,x,x)
            If (flg_apostrofo = False) And (flg_abreparenteses = False) Then

                If c = "," Then
                    b = Strings.Left(b, Len(b) - 1)
                    dados(pnt2) = b
                    pnt2 = pnt2 + 1
                    b = ""
                End If
            End If

            'verificando abre parenteses
            If c = "(" Then
                flg_abreparenteses = True
            End If
            If Mid(Querie, a, 1) = ")" Then
                flg_abreparenteses = False
            End If

            'verificando apostrofe
            If c = "'" Then
                If flg_apostrofo Then
                    flg_apostrofo = False
                Else
                    flg_apostrofo = True
                End If
            End If

            a = a + 1
            c = Mid(Querie, a, 1)
        End While

        'verificando se o número de campos bate com o número de parametros
        If pnt1 <> pnt2 Then
            b = "Falha : Foram encontrados : " + CStr(pnt1) + " campos e " + CStr(pnt2) + " parâmetros"
            MsgBox(b)
            'frmQuerieDecomposta.ListBox1.Items.Add(b)
            If pnt2 > pnt1 Then
                pnt1 = pnt2
            End If
        End If

        'preparando o resultado
        retorno.Clear()

        For a = 0 To pnt1 - 1
            b = CStr(a) + vbTab + campos(a) + vbTab + dados(a)
            retorno.Add(b)
        Next

        Return retorno
    End Function
End Module